package cn.hyy.hrm.controller;

import cn.hutool.crypto.SecureUtil;

import cn.hyy.basic.util.AjaxResult;
import cn.hyy.basic.util.PageList;
import cn.hyy.hrm.RedisClient;
import cn.hyy.hrm.controller.vo.LoginVo;
import cn.hyy.hrm.controller.vo.RegisterVo;
import cn.hyy.hrm.domain.Sso;
import cn.hyy.hrm.query.SsoQuery;
import cn.hyy.hrm.service.ISsoService;
import cn.hyy.hrm.util.CodeConst;
import com.alibaba.fastjson.JSONObject;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.util.StringUtils;
import org.springframework.web.bind.annotation.*;

import java.util.List;
import java.util.UUID;

@RestController
@RequestMapping("/sso")
public class SsoController {
    @Autowired
    public ISsoService ssoService;

    @Autowired
    private RedisClient redisClient;

    /**
     * 用户注册
     * @param registerVo
     * @return
     */
    @PostMapping("/register")
    public AjaxResult register(@RequestBody RegisterVo registerVo){
        try {
            //参数验证
            if(StringUtils.isEmpty(registerVo.getImageCode())){
                return AjaxResult.me().setSuccess(false).setMessage("图形验证码不能为空!");
            }
            if(StringUtils.isEmpty(registerVo.getPhoneNum())){
                return AjaxResult.me().setSuccess(false).setMessage("手机号码不能为空!");
            }
            if(StringUtils.isEmpty(registerVo.getSmsCode())){
                return AjaxResult.me().setSuccess(false).setMessage("短信验证码不能为空!");
            }
            if(StringUtils.isEmpty(registerVo.getPassword())){
                return AjaxResult.me().setSuccess(false).setMessage("密码不能为空!");
            }
            if(StringUtils.isEmpty(registerVo.getUuid())){
                return AjaxResult.me().setSuccess(false).setMessage("非法请求!");
            }

            //判断图形验证码和短信验证码是否正确
            String imageCode = (String) redisClient.getStr(CodeConst.IMAGE_CODE_PRE+registerVo.getUuid()).getResultObj();
            String smsCode = (String) redisClient.getStr(CodeConst.SMS_CODE_PRE+registerVo.getPhoneNum()).getResultObj();
            smsCode = smsCode.split(",")[0]; //  验证码，重发时间

            if(!registerVo.getImageCode().equals(imageCode)){
                return AjaxResult.me().setSuccess(false).setMessage("图形验证码错误!");
            }
            if(!registerVo.getSmsCode().equals(smsCode)){
                return AjaxResult.me().setSuccess(false).setMessage("短信验证码错误!");
            }
            //判断手机号码是否已经注册.....


            ssoService.register(registerVo);
            return AjaxResult.me().setSuccess(true).setMessage("注册成功!");
        } catch (Exception e) {
            e.printStackTrace();
            return AjaxResult.me().setSuccess(false).setMessage("注册失败!");
        }
    }

    /**
     * 登录
     * @param loginVo
     * @return
     */
    @PostMapping("/login")
    public AjaxResult login(@RequestBody LoginVo loginVo){

        //获取账号【用户名/邮箱/手机号码】
        String account = loginVo.getAccount();
        //获取密码
        String password = loginVo.getPassword();

        //参数校验
        if(StringUtils.isEmpty(account)){
            return AjaxResult.me().setSuccess(false).setMessage("账号不能为空");
        }
        if(StringUtils.isEmpty(password)){
            return AjaxResult.me().setSuccess(false).setMessage("密码不能为空");
        }
        //根据邮箱或者手机或者昵称进行查询
        Sso loginUser = ssoService.getOne(new QueryWrapper<Sso>()
                .eq("phone", account)
                .or()
                .eq("email", account)
                .or()
                .eq("nickName", account));
        //登录结果认证
        if(loginUser==null){
            return AjaxResult.me().setSuccess(false).setMessage("账号不存在");
        }
        //密码判断 - 先对明文进行加密，再和数据库中加密后的密码进行比对
        String  encryPassword = SecureUtil.md5(password + loginUser.getSalt());
        if(!encryPassword.equals(loginUser.getPassword())){
            return AjaxResult.me().setSuccess(false).setMessage("密码不正确");
        }
        //用户状态 - 是否冻结。。。。。

        //生成一个ACCESS_TOKEN作为key，用户信息作为value保存到redis中，并且设置过期时间（半个小时）
        String access_token = UUID.randomUUID().toString();
        String value = JSONObject.toJSONString(loginUser);
        redisClient.setStrEX(CodeConst.ACCESS_TOKEN_PRE+access_token,value,30*60);

        return AjaxResult.me().setSuccess(true).setMessage("登录成功!").setResultObj(access_token);
    }


    /**
     * 保存和修改公用的
     * @param sso  传递的实体
     * @return Ajaxresult转换结果
     */
    @RequestMapping(value="/save",method= RequestMethod.POST)
    public AjaxResult save(@RequestBody Sso sso){
        try {
            if(sso.getId()!=null){
                ssoService.updateById(sso);
            }else{
                ssoService.save(sso);
            }
            return AjaxResult.me();
        } catch (Exception e) {
            e.printStackTrace();
            return AjaxResult.me().setMessage("保存对象失败！"+e.getMessage());
        }
    }

    /**
     * 删除对象信息
     * @param id
     * @return
     */
    @RequestMapping(value="/{id}",method=RequestMethod.DELETE)
    public AjaxResult delete(@PathVariable("id") Long id){
        try {
            ssoService.removeById(id);
            return AjaxResult.me();
        } catch (Exception e) {
            e.printStackTrace();
            return AjaxResult.me().setMessage("删除对象失败！"+e.getMessage());
        }
    }

    /**
     * 根据id获取对象信息
     * @param id
     * @return
     */
    @RequestMapping(value = "/{id}",method = RequestMethod.GET)
    public Sso get(@PathVariable("id")Long id)
    {
        return ssoService.getById(id);
    }


    /**
     * 查看所有的对象信息
     * @return
     */
    @RequestMapping(value = "/list",method = RequestMethod.GET)
    public List<Sso> list(){

        return ssoService.list(null);
    }


    /**
     * 分页查询数据
     *
     * @param query 查询对象
     * @return PageList 分页对象
     */
    @RequestMapping(value = "/pagelist",method = RequestMethod.POST)
    public PageList<Sso> json(@RequestBody SsoQuery query)
    {
        Page<Sso> page = new Page<>(query.getPage(),query.getRows());
        page = ssoService.page(page);
        return new PageList<>(page.getTotal(),page.getRecords());
    }
}
